package com.sh.rbac.domain.converter;

import com.sh.rbac.domain.entity.LoginLog;
import com.sh.rbac.core.common.enums.OperationStatusEnum;
import com.sh.rbac.domain.vo.loginLog.LoginLogVO;
import com.sh.rbac.core.common.util.IpAddressUtils;
import org.mapstruct.*;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * 登录日志对象转换器
 *
 * @author wb
 * @since 2024-07-05
 */

@Mapper
public interface LoginLogConverter {

    LoginLogConverter INSTANCE = Mappers.getMapper(LoginLogConverter.class);


    /**
     * 将 LoginLog 转换为 LoginLogVO
     *
     * @param loginLog 登录日志实体类
     * @return 登录日志视图传输对象
     */
    @Mapping(target = "loginAddr", ignore = true) // 忽略 loginAddr
    @Mapping(target = "loginStatus", source = "loginStatus", qualifiedByName = "getLoginStatusDescription")
    LoginLogVO loginLogToLoginLogVO(LoginLog loginLog);


    /**
     * 将 LoginLogList 转换为 LoginLogVOList
     *
     * @param loginLogList 登录日志实体类集合
     * @return 登录日志视图传输对象集合
     */
    List<LoginLogVO> convertToLoginLogVOList(List<LoginLog> loginLogList);


    /**
     * 设置登录地址
     *
     * @param loginLog   登录日志实体类
     * @param loginLogVO 登录日志视图传输对象
     */
    @AfterMapping
    default void setLoginAddr(LoginLog loginLog, @MappingTarget LoginLogVO loginLogVO) {
        loginLogVO.setLoginAddr(IpAddressUtils.getIpPossessionByFile(loginLog.getLoginIp()));
    }

    @Named("getLoginStatusDescription")
    default String getLoginStatusDescription(Integer loginStatus) {
        return OperationStatusEnum.getDescByCode(loginStatus);
    }
}
